Apache HTTP Server mod_lua模块缓冲区溢出漏洞分析(CVE-2021-44790)
更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)
01
漏洞概述
2021年12月20日,Apache 团队发布了Apache HTTP Server 2.4.52版本,修复了Apache HTTP Server中的一个缓冲区溢出漏洞(CVE-2021-44790),该漏洞存在于mod_lua解析器中,当服务器解析恶意请求时触发缓冲区溢出,可导致拒绝服务或执行任意代码。
02
影响范围
影响版本:Apache HTTP Server <= 2.4.51
03
相关介绍
Mod_lua模块
在/etc/httpd/httpd.cnf配置文件中取消下面这行注释,即可开启该模块的功能。
同时还需要添加如下内容,用来配置.lua文件请求的处理方式。
当收到.lua文件请求时,mod_lua模块调用lua-script的handle函数进行处理。下图为handle函数实例。
apr内存池
结构体如下所示:
用户申请内存过程:
(1)首先取最接近不小于8字节倍数大小的空间(8字节对齐),然后根据申请大小判断active节点可用空间是否足够。若内存足够,移动first_avail指针,返回其地址;若空间不足,则继续进行2之后的步骤。
(2)判断下一个内存节点的剩余空间是否足够,若足够则使用之,并将之脱离当前链表;若不足,则通过分配子分配新的内存节点。
(3)将第2步中得到的节点插入active节点之前,并成为新的active节点。
(4)计算旧的active节点的剩余空间大小,并且与其链表后的所有节点的剩余空间大小比较,并插入链表中正确的位置。
04
补丁分析
该漏洞在Apache HTTP Server 2.4.52中进行了修复,在内存申请之前,增加了对长度的合法性校验。当end-crlf小于等于8,程序会直接退出,避免整数溢出。
05
漏洞分析
本文使用Apache HTTP Server 2.4.49版本进行分析,代码中红色方框标识出来的部分即漏洞代码位置,图片中对关键部分进行了相应的注释。
下面结合post数据包来分析程序处理逻辑。构造如下post数据包:
首先,start变量指向post数据包开始的位置,也就是对应上面第一个标识符--VILC2R2IHFHLZZ的位置,crlf指向两个空行(\r\n\r\n)开始的位置,end指向下一个标识符VILC2R2IHFHLZZ开始的位置,那么在crlf和end之间的数据就有下面这些内容,总长度为8(特殊字符长度)+len(数据参数长度)个字节。
根据上面参数内容,我们就可以理解下面这行代码的意义了。vlen等于总长度减去多余的8个特殊字符,就可以计算出参数的长度。
vlen=end-crlf-8;
然后,程序调用apr_pcalloc分配内存。
程序没有对vlen值的合法性进行检查,如果上面参数中的特殊字符缺失,计算的vlen值就可能变为负数,造成整数溢出。当申请空间的时候,会出现安全问题。
06
动态调试
申请超大的空间
使用gdb附加进程,进行动态调试。在漏洞函数处设置断点,然后发送特殊的post请求。
通过‘\r\n\r\n’定位参数开始位置。
然后定位到参数结束的位置,这两个字符串之间的内容即为参数。
当我们申请参数存储空间的时候,apr_palloc()函数就会申请一个巨大的空间,如下图所示:
apr内存池无法提供这么大的内存,这时apr的分配子就会向系统申请内存空间,但是申请的巨大内存空间是系统无法提供的,所以系统会直接将进程kill掉(0x75是进程号),造成拒绝服务。
溢出超长的字节
假设缺失'/r/n--'这4个特殊字符,且数据部分为3字节,vlen=(3+4-8)=-1,调用apr_pcalloc(r->pool, vlen+1)申请内存时,长度vlen+1=0,根据apr内存池内存分配机制,apr内存池会分配最小的内存块8字节,最后使用函数memcpy的时候:
动态调试时可以看到调用apr_palloc时,长度参数是0,实际上会分配8字节的空间。
后面在进行复制的时候,可以看到复制的长度非常大,会发生溢出。
最后程序崩溃。
参考链接:
[1]https://mp.weixin.qq.com/s/XLzXHZYvpPIqNrDz3OHaMA
[2]https://nakedsecurity.sophos.com/2021/12/21/apaches-other-product-critical-bugs-in-httpd-web-server-patch-now/
[3]https://httpd.apache.org/security/vulnerabilities_24.html
[4]https://ubuntu.com/security/CVE-2021-44790
[5]https://github.com/apache/httpd/commit/07b9768cef6a224d256358c404c6ed5622d8acce
启明星辰积极防御实验室(ADLab)
ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截止目前,ADLab已通过CVE累计发布安全漏洞近1100个,通过 CNVD/CNNVD累计发布安全漏洞2000余个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。